// Promise 对象
// 概述
// Promise 对象是 JavaScript 的异步操作解决方案，为异步操作提供统一接口。它起到代理作用（proxy），
// 充当异步操作与回调函数之间的中介，使得异步操作具备同步操作的接口。Promise 可以让异步操作写起来，
// 就像在写同步操作的流程，而不必一层层地嵌套回调函数。
//promist既是一个对象也是构造函数

//生成一个0-2之间的随机数，如果小于1，则等待一段时间后返回成功，否则返回失败：
function asds(resolve, reject) {
    var ran = parseInt(Math.random() * 2)

    setTimeout(() => {
        if (ran === 1)
            resolve(ran)
        else
            reject(ran)
    }, 1000);
}


var pp = new Promise(asds)
pp.then((t) => {
    console.log('张宏是傻卵', t);
})



function add(a) {
    return new Promise(function(resolve, reject) {
        console.log(`我是加法a=${a}`);
        setTimeout(resolve, 800, a * a);
    });
}

function multiply(a) {
    return new Promise(function(resolve, reject) {
        setTimeout(() => {
            console.log(`我是a的乘法a=${a}`);
            resolve(a * a);
        }, 500);
    });
}

var p1 = new Promise(function(resolve, reject) {
    console.log("任务开始咯");
    resolve(1);
});

p1.then(add)
    .then(add)
    .then(multiply)
    .then((a) => {
        console.log(a);
    });




var abs = new Promise(function(resolve, reject) {
    setTimeout(resolve, 500, 'a1');

})


var sb = new Promise(function(resolve, reject) {
        setTimeout(resolve, 1000, 'a2');

    })
    //试想一个页面聊天系统，我们需要从两个不同的URL分别获得用户的个人信息和好友列表，这两个任务是可以并行执行的，用Promise.all()实现如下：
Promise.all([abs, sb]).then(function(array) {
    console.log(array); //得到一个数组
})

//有些时候，多个异步任务是为了容错。比如，同时向两个URL读取用户的个人信息，只需要获得先返回的结果即可。这种情况下，用Promise.race()实现：
Promise.race([abs, sb]).then(function(array) {
    console.log(array); //获取第一个，丢弃第一个后面的
})


//由于p1执行较快，Promise的then()将获得结果'a1'。a2仍在继续执行，但执行结果将被丢弃。